package com.itany.corejava.code11_线程;

/**
 * @author MissChen
 * @date 2024年03月12日 16:28
 */
public class Test10_wait {
    public static void main(String[] args) {
        Object o=new Object();
        MyT1 t1=new MyT1(o);
        MyT2 t2=new MyT2(o);
        t1.setPriority(10);
        t2.setPriority(1);
        t1.start();
        t2.start();
    }
}
class MyT1 extends Thread{
    private Object o;

    public MyT1(Object o) {
        this.o = o;
    }

    @Override
    public void run() {
        System.out.println("------T1线程开始运行了------");
        synchronized (o){//等待和唤醒必须使用的是同一个对象
            try {

                //使得线程放弃对象锁, 进入到等待池
                o.wait();//如果不传递参数, 则表示无法自动唤醒
                // o.wait(1000);//如果传递参数，则参数表示在指定毫秒数之后自动唤醒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("------T1线程继续运行------");
        }
    }
}

class MyT2 extends Thread{
    private Object o;

    public MyT2(Object o) {
        this.o = o;
    }

    @Override
    public void run() {
        System.out.println("------T2线程开始运行了------");
        synchronized (o){//等待和唤醒必须使用的是同一个对象
            // o.notify();//随机唤醒等待池中的某一个线程, 使得对应线程进入锁池
            o.notifyAll();//唤醒的是方法调用者的对象的等待池中的线程
        }
    }
}